package ViewsTUI;

import Controllers.*;
import Models.*;
import byggemarked.Console;
import java.util.ArrayList;

/**
 * @author Erik
 */
public class MachineView {

	private MachineCTR controller;
	
	public MachineView()
	{
		this.controller = new MachineCTR();
		ArrayList<String> options = new ArrayList<String>();
		options.add("Tilføj maskine");
		options.add("Find maskine");
		options.add("Hent maskine");
		options.add("Redigér maskine");
		options.add("Slet maskine");

		boolean isTimeToQuit = false;
		while(!isTimeToQuit)
		{
			Console.printMenu(true, "Maskiner", options);
			int choice = Console.readChoice(0, 4);
			switch(choice)
			{
				case 1: addMachine();		break;
				case 2: findMachine();		break;
				case 3: getMachine();		break;
				case 4: editMachine();		break;
				case 5: removeMachine();	break;
				case 0:	isTimeToQuit = true;
			}
		}
	}

	private void addMachine()
	{
		Console.print("Indtast navn:");
		String name = Console.readString();

		this.controller.addMachine(name);
	}

	private void findMachine(boolean standAlone)
	{
		Console.print("Indtast maskinens navn.");
		String name = Console.readString(true);

		Console.print("Indtast om maskinen er tilgængelig - 1 for Ja, 2 for Nej:");
        int availableInt = Console.readInt();
        boolean available;
        if(availableInt == 1)
        {
            available = true;
        }
        else
        {
            available = false;
        }

		ArrayList<Machine> machines = this.controller.findMachine(name, available);
        if(machines.size() > 0)
		{
			this.showList(machines);
			if(standAlone)
			{
				Console.print("Indtast den ønskede maskines ID, som står ude til venstre i listen.");
				int id = Console.readInt();
				Machine machine = this.controller.getMachine(id);
				if(machine != null)
				{
					this.showInfo(machine);
				}
				else
				{
					Console.print("Der kunne ikke findes nogen maskine med det valgte ID.");
				}
			}
		}
		else
		{
			Console.print("Der fandtes ingen maskiner med de indtastede søgekriterier.");
		}
	}

	private void findMachine()
	{
		this.findMachine(true);
	}

	private void getMachine()
	{
		Console.print("Indtast maskinens ID.");
		int machineInt = Console.readInt();
		Machine machine = this.controller.getMachine(machineInt);
		if(machine != null)
		{
			showInfo(machine);
		}
		else
		{
			Console.print("Der kunne ikke findes nogen maskine med det valgte ID.");
		}
	}

	private void editMachine()
	{
		Console.print("For at redigere en maskine, skal den først findes.");
		Machine machine = null;
		boolean hasValidMachine = false;
		while(!hasValidMachine)
		{
			try
			{
				machine = searchProcedure();
				if(machine != null)
				{
					hasValidMachine = true;
				}
				else
				{
					return;
				}
			}
			catch(Exception e)
			{ }
		}
		Console.print("Indtast navn ("+machine.getName()+"):");
		String name = Console.readString(true);
		if(!name.equals("")) { machine.setName(name); }
	}

	private void removeMachine()
	{
		Console.print("For at slette en maskine, skal den først findes.");
		Machine machine = null;
		boolean hasValidMachine = false;
		while(!hasValidMachine)
		{
			try
			{
				machine = searchProcedure();
				if(machine != null)
				{
					hasValidMachine = true;
				}
				else
				{
					return;
				}
			}
			catch(Exception e)
			{ }
		}
		String name = machine.getName();
		this.controller.removeMachine(machine);
		Console.print(name+" er nu slettet fra maskinedatabasen.");
	}

	private Machine searchProcedure() throws Exception
	{
		Console.print("Hvordan vil du finde maskinen?");
		ArrayList<String> options = new ArrayList<String>();
		options.add("ID");
		options.add("Søgning");
		options.add("Liste");
		Console.printMenu(false, null, options);

		int choice = Console.readChoice(0, 3);
		int id = 0;
		boolean doSomething = true;
		switch(choice)
		{
			case 1:
				Console.print("Indtast maskinens ID.");
				id = Console.readInt();
				break;
			case 2:
				Console.print("Indtast den ønskede maskines ID, som står ude til venstre i listen af søgeresultater.");
				this.findMachine(false);
				id = Console.readInt();
				break;
			case 3:
				Console.print("Indtast den ønskede maskines ID, som står ude til venstre i listen.");
				this.showList(this.controller.getAllMachines());
				id = Console.readInt();
				break;
			case 0:
				doSomething = false;
				break;

		}
		if(doSomething)
		{
			Machine machine = this.controller.getMachine(id);
			if(machine != null)
			{
				return machine;
			}
			else
			{
				Console.print("Der kunne ikke findes nogen maskine med det valgte ID.");
				throw new Exception();
			}
		}
		else
		{
			return null;
		}
	}

	private int showList(ArrayList<Machine> machines)
	{
		int i = 0;
		for (Machine machine : machines){
			i++;
			Console.print("{"+machine.getId()+"}: "+machine.getName());
		}
		return i;
	}

	private void showInfo(Machine machine)
	{
		Console.print("Navn: " + machine.getName());
	}
}
